/**
 * @Author       : Mo 2427995270@qq.com
 * @Date         : 2025-06-10 16:21:50
 * @LastEditTime : 2025-06-13 11:51:20
 * @FilePath     : \GD32F407_BL\mobl\hal_driver\hal_systick.h
 * @Description  : systick抽象层
 * @Version      : V1.0
 * @History      :
 * @Note         :
 */
#ifndef __hal_systick_H__
#define __hal_systick_H__

/***************************************Includes***********************************/

#include "os_config.h"
#include <stdint.h>

/*************************************Public Macros********************************/
#define systick_hal_get_arg(sht) ((sht)->arg)


/***********************************Public Statement*******************************/

struct systick_hal;
typedef struct systick_hal systick_hal_t;

typedef void (*systick_hal_cb_t)(systick_hal_t *sht);
struct systick_hal {
    uint32_t start;           // 开始tick
    uint32_t time;            // 定时时长
    systick_hal_cb_t cb;      // 定时器到时回调函数
    const char *name;         // 定时器名
    void *arg;                // 用户参数
    uint8_t timer_en;         // 使能定时器
    struct systick_hal *next; // 指向下一个对象
};


/***********************************Public Functions*******************************/

/**
 * @brief 初始化tick节拍时间
 * @param  tick_ms          每 tick_ms 调用systick_hal_increase
 * @note 建议tick_ms为1ms 时间长了一些对象的定时任务有偏差
 */
void systick_hal_init(uint32_t ms);
/**
 * @brief 节拍增加 需在systick中断中调用或在定时器中断中调用
 * @note null
 */
void systick_hal_increase(void);
/**
 * @brief 添加定时器
 * @param  sht              句柄
 * @param  time_ms          定时时长
 * @param  name             定时器名
 * @param  cb               定时到时回调函数
 * @param  arg              用户参数
 * @return int 0成功 -1未初始化
 * @note null
 */
int systick_hal_add_timer(systick_hal_t *sht, uint32_t time_ms, const char *name, systick_hal_cb_t cb, void *arg);
/**
 * @brief 删除定时器
 * @param  sht              句柄
 * @note null
 */
void systick_hal_remove_timer(systick_hal_t *sht);
/**
 * @brief 启动定时器
 * @param  sht              句柄
 * @note null
 */
void systick_hal_start_timer(systick_hal_t *sht);
/**
 * @brief 停止定时器
 * @param  sht              句柄
 * @note null
 */
void systick_hal_stop_timer(systick_hal_t *sht);
/**
 * @brief 重置定时器计时
 * @param  sht              句柄
 * @note null
 */
void systick_hal_reset_timer(systick_hal_t *sht);

/************************** ********Public Variables************************** ****/


#endif
/* [] END OF FILE */
